package com.cskaoyan.day2.list._02_api;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Common-zhou
 * @since 2023-02-28 16:41
 */
public class Demo1 {
    public static void main(String[] args) {

        //testListAddWithIndex();

        //testListAddWithIndex2();
        //
        //testAddAllWithIndex();

        //testRemoveWithIndex();

        //testRemoveWithIndex2();

        //testSet();

        //testGet();

        //testIndexOf();

        testLastIndexOf();

    }

    private static void testLastIndexOf() {
        //    int lastIndexOf(Object o)： 获取元素的最后一个index

        List<String> list = new ArrayList<>();
        list.add("zs");
        list.add("ls");
        list.add("wu");
        list.add("zs");
        list.add("ls");

        // 返回最后一个元素
        System.out.println(list.lastIndexOf("zs"));
        // 如果不存在，则返回-1
        System.out.println(list.lastIndexOf("Java"));
    }

    private static void testIndexOf() {
        //    int indexOf(Object o)： 获取元素的首个index
        List<String> list = new ArrayList<>();
        list.add("zs");
        list.add("ls");
        list.add("wu");
        list.add("zs");
        list.add("ls");

        // 当它存在的时候，会返回下标
        // 有多个数据的时候，会返回第一个
        int index = list.indexOf("zs");
        System.out.println(index);

        // 如果不存在 会返回-1
        int index1 = list.indexOf("Java");
        System.out.println(index1);


    }

    private static void testGet() {
        List<String> list = new ArrayList<>();
        list.add("zs");
        list.add("ls");
        list.add("wu");
        list.add("ls");

        //  for循环遍历
        //for (String s : list) {
        //    System.out.println(s);
        //}

        // 可以使用fori循环来遍历数据
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

    }

    private static void testSet() {
        //    E set(int index, E element)： 设置指定下标的元素为element
        List<String> list = new ArrayList<>();
        list.add("zs");
        list.add("ls");
        list.add("wu");

        System.out.println(list);
        // zs   ls   wu
        //list.set(0, "Java");
        // Java   ls   wu

        System.out.println(list);

        // [0,length - 1] 只能设置的范围

    }

    /**
     * 大家需要注意；
     * 使用remove了之后，下标会发生变化。可能会出现数组越界。
     * 解决办法，可以从后往前遍历
     */
    private static void testRemoveWithIndex2() {
        List<String> list = new ArrayList<>();
        list.add("zs");
        list.add("ls");
        list.add("zs");
        list.add("wu");
        list.add("zs");

        //   zs   ls    zs   wu   zs
        //   0    1     2     3    4

        // [0, 2, 4]

        // 现在需要删除所有的 zs
        List<Integer> list1 = new ArrayList<>();

        for (int i = 0; i < list.size(); i++) {
            String name = list.get(i);
            if ("zs".equals(name)) {
                list1.add(i);
            }
        }

        System.out.println(list1);

        //for (Integer index : list1) {
        //    list.remove(index.intValue());
        //}

        //System.out.println(list);
        //System.out.println(list1);
        for (int i = list1.size() - 1; i >= 0; i--) {
            // 我们需要删除的index
            Integer index = list1.get(i);
            list.remove(index.intValue());
        }
        System.out.println(list);

    }

    private static void testRemoveWithIndex() {
        //    E remove(int index)：删除指定下标的元素，只能删除下标的位置[0, lenth-1]。返回的是删除的元素

        List<String> list = new ArrayList<>();
        list.add("zs");
        list.add("ls");
        list.add("wu");

        //list.remove("zs");
        //System.out.println(list);

        // remove的范围 [0,length-1]
        //list.remove(0);
        //System.out.println(list);

        //list.remove(2);
        //System.out.println(list);

        //list.remove(3);
    }

    private static void testAddAllWithIndex() {
        //    boolean addAll(int index, Collection<? extends E> c)： 在指定位置添加一个Collection的所有元素
        List<Integer> list = new ArrayList<>();

        list.add(10);
        list.add(20);
        list.add(6);
        list.add(8);

        //List<String> list1 = new ArrayList<>();
        //list1.add("zs");
        //list.addAll(list1);

        List<Integer> list1 = new ArrayList<>();
        list1.add(10);
        list1.add(8);

        //  10   20   6   8
        //10   8    10   20   6   8
        // 还是要注意。谁调用的方法 往谁里面添加
        list.addAll(0, list1);

        System.out.println(list);


    }

    private static void testListAddWithIndex2() {
        List<Integer> list = new ArrayList<>();

        list.add(10);
        list.add(20);
        list.add(6);
        list.add(8);
        //   10    20    6    8
        //
        //list.add(2, 5);
        //    10    20    5    6    8
        //System.out.println(list);


        //   10    20    6    8
        //   9    10    20    6    8
        //list.add(0, 9);
        //System.out.println(list);

        // 范围是怎样的
        //  10   20    6   8
        //  [0, length]

    }

    private static void testListAddWithIndex() {
        //    void add(int index, E element)： 在指定位置添加元素。list添加的位置，只能在[0,length之间]

        List<String> list = new ArrayList<>();

        list.add("zs");
        list.add("ls");
        list.add("wu");

        System.out.println(list);

        //   zs    ls     wu
        // zs      Java    ls     wu
        //list.add(1, "Java");
        //System.out.println(list);

        // zs    ls     wu         C++
        //list.add(3, "Python");
        //System.out.println(list);

        // lang.IndexOutOfBoundsException
        //list.add(4, "C++");

        // index 的位置，范围是 [0,length]

    }
}
